package ca.uvic.cs.tagsea.editing; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.HashSet; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ListDialog; import org.eclipse.ui.part.FileEditorInput; import ca.uvic.cs.tagsea.TagSEAPlugin; import ca.uvic.cs.tagsea.core.Tag; import ca.uvic.cs.tagsea.core.Waypoint; public class RefactorHelp { protected static boolean requestSave(Tag[] tags) { HashSet<Waypoint> waypoints = new HashSet<Waypoint>(); for (Tag tag : tags) { waypoints.addAll(Arrays.asList(tag.getAllWaypoints())); } TagSEAPlugin plugin = TagSEAPlugin.getDefault(); if (plugin == null) return false; IEditorPart[] editors = plugin. getWorkbench(). getActiveWorkbenchWindow(). getActivePage(). getDirtyEditors(); final HashSet<IEditorPart> editorsToSave = new HashSet<IEditorPart>(); for (Waypoint waypoint : waypoints) { IMarker marker = waypoint.getMarker(); if (marker != null) { IResource resource = marker.getResource(); for (IEditorPart editor : editors) { IEditorInput input = editor.getEditorInput(); if (input instanceof FileEditorInput) { if (((FileEditorInput)input).getFile().equals(resource)) { editorsToSave.add(editor); } } } } } Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell(); if (editorsToSave.size() > 0) { ListDialog dialog = new ListDialog(shell); dialog.setAddCancelButton(true); dialog.setTitle("Must Save Editors"); dialog.setMessage( "The following editors must be saved before the refactoring can continue. " + "Please save them and try again. " + "Select 'OK' to save, or 'Cancel' to cancel." ); dialog.setLabelProvider(new LabelProvider(){ public Image getImage(Object element) { return ((IEditorPart)element).getTitleImage(); } @Override public String getText(Object element) { return ((IEditorPart)element).getTitle(); } }); dialog.setContentProvider(new ArrayContentProvider()); dialog.setInput(editorsToSave); int result = dialog.open(); if (result == ListDialog.CANCEL) return false; ProgressMonitorDialog saveDialog = new ProgressMonitorDialog(shell); try { saveDialog.run(false, false, new IRunnableWithProgress(){ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { for (IEditorPart editor : editorsToSave) { editor.doSave(new NullProgressMonitor()); } }}); } catch (InvocationTargetException e) { TagSEAPlugin.log(e.getLocalizedMessage(), e); } catch (InterruptedException e) { } return false; } return true; } }